﻿using System;
using System.Data;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implemente BLPresupuestoRepuesto
    /// </summary>
    class BLIMPLPresupuestoRepuesto:Presupuesto_BL.BLPresupuestoRepuesto
    {
        DAOPresupuestoRepuesto createPresupuestoRepuesto = DAOFactoryPresupuesto.createPresupuestoRepuesto();
        BLRepuestos createRepuesto = BLFactoryPresupuesto.createRepuesto();
        BLPresupuestos createPresupuesto = BLFactoryPresupuesto.createPresupuesto();

        /// <summary>
        /// Guarda los repuestos asociados a un presupuesto
        /// </summary>
        /// <param name="preRe">Objeto con los repuestos asociados a un presupuesto</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool savePresupuestoRepuesto(presupuestoRepuestoDTO preRe)
        {
            Boolean correcto = false;

            try
            {
                presupuestosDTO p = createPresupuesto.getPresupuesto(preRe.CodigoPresupuesto);
                int i = 0;
                int cont = 0;
                foreach (string codigo in preRe.CodigoRepuesto)
                {
                    repuestosDTO r = createRepuesto.getRepuesto(codigo);

                    bool insertado = createPresupuestoRepuesto.savePresupuestoRepuesto(p.ID, r.ID, preRe.Cantidad[i], preRe.PrecioUnitario[i], preRe.PrecioTotal[i]);
                    
                    if (insertado)
                    {
                        cont++;    
                    }

                    i++;
                }

                if (cont == i)
                {
                    correcto = true;
                }

            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica los repuestos asociados a un presupuesto
        /// </summary>
        /// <param name="preRe">Objeto con los repuestos asociados a un presupuesto</param>
        /// <param name="id">Determina el presupuesto a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updatePresupuestoRepuesto(presupuestoRepuestoDTO preRe, int id)
        {
            Boolean correcto = false;
            
            try
            {
                presupuestosDTO p = createPresupuesto.getPresupuesto(preRe.CodigoPresupuesto);
                if (null != p)
                {
                    Boolean eliminado = createPresupuestoRepuesto.deletePresupuestoCliente(p.ID);
                    if (eliminado)
                    {
                        int i = 0;
                        int cont = 0;
                        foreach (string codigo in preRe.CodigoRepuesto)
                        {
                            repuestosDTO r = createRepuesto.getRepuesto(codigo);

                            bool modificado = createPresupuestoRepuesto.savePresupuestoRepuesto(p.ID, r.ID, preRe.Cantidad[i], preRe.PrecioUnitario[i], preRe.PrecioTotal[i]);

                            if (modificado)
                            {
                                cont++;
                            }

                            i++;
                        }

                        if (cont == i)
                        {
                            correcto = true;
                        }
                    }    
                    }
                    
                

            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina los repuestos asociados un presupuesto
        /// </summary>
        /// <param name="id">Determina el presupuesto a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deletePresupuestoRepuesto(int id)
        {
            Boolean correcto = false;

            try
            {
                Boolean eliminado = createPresupuestoRepuesto.deletePresupuestoCliente(id);

                if (eliminado)
                {
                    correcto = true;
                }

            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los presupuestos de repuestos
        /// </summary>
        /// <returns>Devuelve una tabla con los presupuestos</returns>
        public DataTable getAllPresupuestoRepuesto()
        {
            DataTable listadoPresupuestoRepuesto = null;

            try
            {
                DataTable preRe = createPresupuestoRepuesto.getAllPresupuestoRepuesto();

                if (null != preRe)
                {
                    listadoPresupuestoRepuesto = preRe;
                }
            }
            catch (Exception ex)
            {

                listadoPresupuestoRepuesto = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return listadoPresupuestoRepuesto;
        }

        /// <summary>
        /// Obtiene un presupuesto y los repuestos asignados
        /// </summary>
        /// <param name="codigoPresupuesto">Determina el presupuesto a obtener</param>
        /// <returns>Devuelve un objeto presupuestoRepuesto</returns>
        public presupuestoRepuestoDTO getPresupuestoRepuesto(string codigoPresupuesto)
        {
            presupuestoRepuestoDTO preRe = null;

            try
            {
                presupuestoRepuesto pr = createPresupuestoRepuesto.getPresupuestoRepuesto(codigoPresupuesto);

                if (null != pr)
                {
                    preRe = new presupuestoRepuestoDTO();
                    preRe.PrecioUnitario = pr.PrecioUnitario;
                    preRe.PrecioTotal = pr.PrecioTotal;
                    preRe.DescripcionRepuesto = pr.DescripcionRepuesto;
                    preRe.CodigoRepuesto = pr.CodigoRepuesto;
                    preRe.CodigoPresupuesto = pr.CodigoPresupuesto;
                    preRe.Cantidad = pr.Cantidad;
                }
            }
            catch (Exception ex)
            {

                preRe = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return preRe;
        }
    }
}
